package tests

import org.junit.runner.RunWith
import org.scalatest.junit.JUnitRunner
import org.scalatest.Suite
import comunicaciones.LlamadaLocal
import traits.TDescuentoHablateTodo
import traits.TDescuentoPlanAmigos
import traits.TDescuentoCiudadesAmigas
import comunicaciones.LlamadaLargaDistancia

@RunWith(classOf[JUnitRunner])
class TestTraits extends Suite{

 //---------- Test trait TDescuentoHablateTodo en Llamadas Locales----------------------------------------------------------
  def testLlamadaLocalDeDuracionMayorA5MinutosConPlanHablateTodoEnFinDeSemana(){
      var call = new LlamadaLocal(0,301) with TDescuentoHablateTodo{
          override def esDeFinDeSemana = true
      }
      assert(call.getDuracion() == 300)
  }
  
  def testLlamadaLocalDeDuracionMenorA5MinutosConPlanHablateTodoEnFinDeSemana(){
      var call = new LlamadaLocal(0,299) with TDescuentoHablateTodo{
          override def esDeFinDeSemana = true
      }
      assert(call.getDuracion() == 299)
  }
  
  def testLlamadaLocalDeDuracionMayorA5MinutosConPlanHablateTodoYNoEsFinDeSemana(){
      var call = new LlamadaLocal(0,301) with TDescuentoHablateTodo{
          override def esDeFinDeSemana = false
      }
      assert(call.getDuracion() == 301)
  }
  
//--------- Test trait TDescuentoHablateTodo en Llamadas de LargaDistancia----------------------------------------------------
  def testLargaDistanciaMayorA5MinutosConPlanHablateTodoEnFinDeSemana(){
      var call = new LlamadaLargaDistancia(0,301,"","","") with TDescuentoHablateTodo{
          override def esDeFinDeSemana = true
      }
      assert(call.getDuracion() == 300)
  }
  
  def testLlamadaLargaDistanciaDeDuracionMenorA5MinutosConPlanHablateTodoEnFinDeSemana(){
      var call = new LlamadaLargaDistancia(0,299,"","","") with TDescuentoHablateTodo{
          override def esDeFinDeSemana = true
      }
      assert(call.getDuracion() == 299)
  }
  
  def testLlamadaLargaDistanciaDeDuracionMayorA5MinutosConPlanHablateTodoYNoEsFinDeSemana(){
      var call = new LlamadaLargaDistancia(0,301,"","","") with TDescuentoHablateTodo{
          override def esDeFinDeSemana = false
      }
      assert(call.getDuracion() == 301)
  }
  
//---------Test trait TDescuentoPlanAmigos en Llamadas Locales------------------------------------------------------------
  def testLlamadaLocalConPlanNumsAmigosDondeElNumeroDestinoEstaEnElPlan(){
       var call = new LlamadaLocal(0606456,300) with TDescuentoPlanAmigos{
            def numerosEnPlan : List[Int] = List(42545566, 0606456)
       }
       assert(call.getDuracion() == 0)
  }
  
  def testLlamadaLocalConPlanNumsAmigosDondeElNumeroDestinoNoEstaEnElPlan(){
       var call = new LlamadaLocal(0606456,300) with TDescuentoPlanAmigos{
            def numerosEnPlan : List[Int] = List(42545566, 1606456)
       }
       assert(call.getDuracion() == 300)
  }
  
//---------Test trait TDescuentoPlanAmigos en Llamadas Locales--------------------------------------------------------------
  def testLlamadaLargaDistanciaConPlanNumsAmigosDondeElNumeroDestinoEstaEnElPlan(){
       var call = new LlamadaLargaDistancia(0606456,300,"","","") with TDescuentoPlanAmigos{
            def numerosEnPlan : List[Int] = List(42545566, 0606456)
       }
       assert(call.getDuracion() == 0)
  }
  
  def testLlamadaLargaDistanciaConPlanNumsAmigosDondeElNumeroDestinoNoEstaEnElPlan(){
       var call = new LlamadaLargaDistancia(0606456,300,"","","") with TDescuentoPlanAmigos{
            def numerosEnPlan : List[Int] = List(42545566, 1606456)
       }
       assert(call.getDuracion() == 300)
  }
  
//-----------Test trait TDescuentoCiudadesAmigas en Llamadas LargaDistancia------------------------------------------------
 def testLlamadaLargaDistanciaConPlanCiudadesAmigasDondeLaCiudadEstaEnElPlan(){
    var call = new LlamadaLargaDistancia(0,300,"","Wilde","") with TDescuentoCiudadesAmigas{
      def ciudadEnPlan :String = "Wilde"
    }
    assert(call.getDuracion() == 0)
 }
 
  def testLlamadaLargaDistanciaConPlanCiudadesAmigasDondeLaCiudadNoEstaEnElPlan(){
    var call = new LlamadaLargaDistancia(0,300,"","Wilde","") with TDescuentoCiudadesAmigas{
      def ciudadEnPlan :String = "Ezpeleta"
    }
    assert(call.getDuracion() == 300)
 }
  
//-------------Test  with TDescuentoPlanAmigos with TDescuentoHablateTodo--------------------------------------------------
  def testLlamadaLocalConPlanNumerosAmigosYHablateTodoDondeEsFinDeSemanaYElNunEstaEnElPlan(){
    var call = new LlamadaLocal(42545566,301) with TDescuentoPlanAmigos with TDescuentoHablateTodo{
       override def esDeFinDeSemana = true
       def numerosEnPlan : List[Int] = List(42545566, 0606456)
    }
    assert(call.getDuracion() == 0)
  }
  
  def testLlamadaLocalConHablateTodoYPlanNumerosAmigosDondeEsFinDeSemanaYElNunEstaEnElPlan(){ // orden invertido
    var call = new LlamadaLocal(42545566,301) with TDescuentoHablateTodo with TDescuentoPlanAmigos{
       override def esDeFinDeSemana = true
       def numerosEnPlan : List[Int] = List(42545566, 0606456)
    }
    assert(call.getDuracion() == 0)
  }

  def testLlamadaLocalConPlanNumerosAmigosYHablateTodoDondeNoEsFinDeSemanaYElNunEstaEnElPlan(){
    var call = new LlamadaLocal(42545566,301) with TDescuentoPlanAmigos with TDescuentoHablateTodo{
       override def esDeFinDeSemana = false // no es fin de semana
       def numerosEnPlan : List[Int] = List(42545566, 0606456)
    }
    assert(call.getDuracion() == 0)
  }
  
  def testLlamadaLocalConPlanNumerosAmigosYHablateTodoDondeEsFinDeSemanaYElNumNoEstaEnElPlan(){
    var call = new LlamadaLocal(55555555,301) with TDescuentoPlanAmigos with TDescuentoHablateTodo{
       override def esDeFinDeSemana = true
       def numerosEnPlan : List[Int] = List(42545566, 0606456)
    }
    assert(call.getDuracion() == 300) // Solo cobra los primeros 5 minutos
  }
  
//-------------Test  with TDescuentoPlanAmigos with TDescuentoHablateTodo with TDescuentoCiudadesAmigas---------------------
  def testLlamadasLargaDistanciaConPlanesAmigosCiudadesAmigasYHablateTodo(){
     var call = new LlamadaLargaDistancia(42545566,301,"","Wilde","") with TDescuentoPlanAmigos with TDescuentoHablateTodo with TDescuentoCiudadesAmigas{
       override def esDeFinDeSemana = true
       def numerosEnPlan : List[Int] = List(42545566, 0606456)
       def ciudadEnPlan : String = "Wilde"
    }
     assert(call.getDuracion() == 0)
  }
  
  def testLlamadasLargaDistanciaConPlanesAmigosCiudadesAmigasYHablateTodoLaCiudadYNumeroAmigoNoEstanEnPlan(){
     var call = new LlamadaLargaDistancia(55555555,301,"","Wilde","") with TDescuentoPlanAmigos with TDescuentoHablateTodo with TDescuentoCiudadesAmigas{
       override def esDeFinDeSemana = true
       def numerosEnPlan : List[Int] = List(42545566, 0606456)
       def ciudadEnPlan : String = "Quilmes"
    }
     assert(call.getDuracion() == 300)
  }
  
  def testLlamadasLargaDistanciaConPlanesAmigosCiudadesAmigasYHablateTodoConCiudadEnPlanYNumeroAmigoNo(){
     var call = new LlamadaLargaDistancia(42545567,301,"","Wilde","") with TDescuentoPlanAmigos with TDescuentoHablateTodo with TDescuentoCiudadesAmigas{
       override def esDeFinDeSemana = true
       def numerosEnPlan : List[Int] = List(42545566, 0606456)
       def ciudadEnPlan : String = "Wilde"
    }
     assert(call.getDuracion() == 0)
  }
  
  def testLlamadasLargaDistanciaConPlanesAmigosCiudadesAmigasYHablateTodoSinCiudadEnPlanYNumeroAmigoSi(){
     var call = new LlamadaLargaDistancia(42545566,301,"","Wilde","") with TDescuentoPlanAmigos with TDescuentoHablateTodo with TDescuentoCiudadesAmigas{
       override def esDeFinDeSemana = true
       def numerosEnPlan : List[Int] = List(42545566, 0606456)
       def ciudadEnPlan : String = "Quilmes"
    }
     assert(call.getDuracion() == 0)
  }
  
  def testLlamadasLargaDistanciaConPlanesAmigosCiudadesAmigasYHablateTodoYNoesFinDeSemana(){
     var call = new LlamadaLargaDistancia(42545566,301,"","Wilde","") with TDescuentoPlanAmigos with TDescuentoHablateTodo with TDescuentoCiudadesAmigas{
       override def esDeFinDeSemana = false
       def numerosEnPlan : List[Int] = List(42545566, 0606456)
       def ciudadEnPlan : String = "Wilde"
    }
     assert(call.getDuracion() == 0)
  }
  
  def testLlamadasLargaDistanciaConPlanesAmigosCiudadesAmigasYHablateTodoYNoesFinDeSemanaYElNumYCiudadNoEstanEnPlan(){
     var call = new LlamadaLargaDistancia(42545566,301,"","Wilde","") with TDescuentoPlanAmigos with TDescuentoHablateTodo with TDescuentoCiudadesAmigas{
       override def esDeFinDeSemana = false
       def numerosEnPlan : List[Int] = List(42545567, 0606456)
       def ciudadEnPlan : String = "Quilmes"
    }
     assert(call.getDuracion() == 301)
  }
}